/**
 * @file pwm.h
 * @author leijiapeng (email:leijiapeng123@163.com)
 * @brief
 * @version 0.1
 * @date 2025-09-18
 *
 * @copyright Copyright (c) 2025
 *
 */

#ifndef __PWM_H
#define __PWM_H

#include "stdint-gcc.h"
#include "stm32f1xx_hal.h"

/**
 * @brief  对stm32的hal库的TIM通道进行重新命名
 *
 */
typedef enum
{
    CHANNEL_1   = TIM_CHANNEL_1,
    CHANNEL_2   = TIM_CHANNEL_2,
    CHANNEL_3   = TIM_CHANNEL_3,
    CHANNEL_4   = TIM_CHANNEL_4,
    CHANNEL_ALL = TIM_CHANNEL_ALL,
} TIM_Channel;

/**
 * @brief  PWM实例结构体
 *
 */
typedef struct pwm_ins_temp
{
    TIM_HandleTypeDef *htim;      // TIM句柄
    TIM_Channel        channel;   // 通道
    uint32_t           tclk;      // 时钟频率，Hz
    float              period;    // 周期，秒
    uint8_t            dutyratio; // 占空比，[0, 100]
} PWM_Instance;

/**
 * @brief  初始化PWM
 *
 * @param[out] pwm          pwm实例
 * @param[in]  htim         TIM句柄
 * @param[in]  channel      通道
 * @param[in]  tclk         时钟频率，Hz
 * @param[in]  period       周期，秒
 * @param[in]  dutyratio    占空比，[0, 100]
 * @return uint8_t 返回1表示成功，0表示失败
 */
uint8_t PWM_Init(PWM_Instance *pwm, TIM_HandleTypeDef *htim, TIM_Channel channel, uint32_t tclk, float period,
                 uint8_t dutyratio);

/**
 * @brief 设置PWM的周期
 *
 * @param[in]  pwm    pwm实例
 * @param[in]  period 周期，秒
 * @return uint8_t 返回1表示成功，0表示失败
 */
uint8_t PWM_SetPeriod(PWM_Instance *pwm, float period);

/**
 * @brief  设置PWM的占空比
 *
 * @param[in]  pwm       pwm实例
 * @param[in]  dutyratio 占空比，[0, 100]
 * @return uint8_t 返回1表示成功，0表示失败
 */
uint8_t PWM_SetDutyRatio(PWM_Instance *pwm, uint8_t dutyratio);

/**
 * @brief  开启PWM输出
 *
 * @param[in] pwm pwm实例
 */
void PWM_Start(PWM_Instance *pwm);

/**
 * @brief  停止PWM输出
 *
 * @param[in] pwm
 */
void PWM_Stop(PWM_Instance *pwm);

#endif // !__PWM_H
